#include "Sql_list.h"

// 初始化操作
// 需要输入初始最大空间大小
Sql_list *Init_Sql_List(int MAX_SIZE)
{
    // 为数据关系结构体创建一个动态空间
    Sql_list *L = (Sql_list *)malloc(sizeof(Sql_list));
    if (L == NULL)
    {
        printf("分配内存失败\n");
        return NULL;
    }

    // 为数据对象创建一个动态空间
    L->data = (Elenemt_data *)malloc(MAX_SIZE * sizeof(Elenemt_data));
    if (L->data == NULL)
    {
        printf("分配内存失败\n");
        free(L);
        return NULL;
    }

    // 初始化 max 和 len
    L->max = MAX_SIZE;
    L->len = 0;

    // 返回数据关系结构体
    return L;
}

//  尾插
void tail_insert_list(Sql_list *L, Elenemt_data data)
{
    // 安全判断
    if (NULL == L)
    {
        printf("顺序表 为 NULL \n");
        return;
    }
    if (L->max <= L->len)
    {
        printf("顺序表 为 满 \n");
        return;
    }

    // 插入
    L->data[L->len] = data;
    // 迭代
    L->len++;
}

//  尾删
void tail_del_list(Sql_list *L)
{
    // 安排判断
    if (NULL == L)
    {
        printf("顺序表 为 NULL \n");
        return;
    }
    if (0 >= L->len)
    {
        printf("顺序表 内 无数据 \n");
        return;
    }

    L->len--;
}

//  遍历打印
void printf_Sql_List(Sql_list *L)
{
    // 安全判断
    if (NULL == L)
    {
        printf("顺序表 为 NULL \n");
        return;
    }
    if (0 == L->len)
    {
        printf("顺序表 内 无数据 \n");
        return;
    }

    for (size_t i = 0; i < L->len; i++)
    {
        printf("姓名:%s 性别:%s 年龄:%d 成绩:%d 学号:%d\n",
               L->data[i].name, L->data[i].sex, L->data[i].age,
               L->data[i].sco, L->data[i].id);
    }
}

// 顺序表扩容
Elenemt_data *Expand_Sql_List(Sql_list *L, int num)
{
    // 安全判断
    if (NULL == L)
    {
        printf("顺序表 为 NULL \n");
        return NULL;
    }
    if (NULL == L->data)
    {
        printf("顺序表 为 NULL \n");
        return NULL;
    }
    if (num == L->max)
    {
        printf("无操作\n");
        return NULL;
    }
    Elenemt_data *new_data = (Elenemt_data *)malloc(num * sizeof(Elenemt_data));
    //给新空间赋值
    for (size_t i = 0; i < L->len && i < num; i++)
    {
        new_data[i] = L->data[i];
    }
    // 3 释放原空间
    free(L->data);

    // 4 将 表的 data 指向 新空间
    L->data = new_data;

    // 5 修改 max 的值
    L->max = num;

    // 6 返回 新数据的地址
    return new_data;
}

// 顺序表的销毁
void Destroy_Sql_List(Sql_list **L)
{
    if (NULL == *L)
    {
        printf("表为 NULL\n");
        return;
    }
    if (NULL == (*L)->data)
    {
        printf("表为 NULL\n");
        return;
    }

    // 先销毁数据
    free((*L)->data);
    (*L)->data = NULL;

    // 销毁表
    free(*L);
    *L = NULL;
}